sequenceDiagram autonumber participant C as Customer Browser participant W as VideoEngager Widget participant VE as VideoEngager API<br/>(/availability, /create) participant GC as Genesys Cloud<br/>Callback API participant EM as Email Service *(opt.)* participant REM as Reminder Scheduler *(opt.)* %% 1 Collect data C->>W: Enter name, email, phone %% 2 Check availability W->>VE: GET /availability?start=...&days=n VE-->>W: JSON time-slots (capacity/interval) :contentReference[oaicite:0]{index=0} %% 3 Visualise calendar W-->>C: Render calendar with open slots %% 4 Select slot C->>W: Click slot (date, start-time) %% 5 Create schedule W->>VE: POST /create {slot, visitor data} VE->>GC: POST /conversations/callbacks (scheduledTime) GC-->>VE: Callback ID VE-->>W: Confirmation payload (meeting URLs, ICS) %% 6 Notify customer (opt.) alt customer-email configured VE->>EM: Send “Booking confirmed” w/ ICS end %% 7 Notify agent (opt.) alt agent-email configured VE->>EM: Send agent invite end %% 8 Schedule reminder (opt.) alt reminder enabled VE->>REM: enqueue T-15 min reminder end
(aligns to §7.2 “Scheduled entry mode” and the 8-step outline you provided)
The visitor opens the “Book a video appointment” page and fills the short form:
{
"name": "Fatima Al-Ali",
"email": "fatima@example.ae",
"phone": "+971-5X-XXX-XXXX",
"productLine": "Post-paid",
"preferredLang": "ar"
}
VideoEngager.scheduleWidget.collect() stores the payload and fires scheduleWidget.openCalendar().
SDK layer: still the facade (genesys-hub.umd.js); data is cached for later submission.
The widget calls GET /availability on the VideoEngager back-end:
/availability?queueId=VIP-Video-Q&days=14&lang=ar
Server logic
startTime, duration) trimmed to visitor’s locale.The widget renders an inline calendar; green cells show open slots; greyed cells are full or out of hours. Hovering a slot shows estimated wait time (“15 min”). (Meets §7.2 – calendar visual and wait-time transparency.)
Fatima clicks Tue 3 Jun, 14:30 GST. Widget captures:
{
"scheduledTime": "2025-06-03T10:30:00Z",
"queueId": "VIP-Video-Q",
"skills": ["Arabic","Video"],
"attributes":{ "productLine":"Post-paid" }
}
The facade calls POST /create with the chosen slot and visitor data.
VideoEngager back-end does two things:
POST /conversations/callbacks{
"callbackUserName":"Fatima Al-Ali",
"callbackNumbers":["+9715XXXX"],
"queueId":"VIP-Video-Q",
"skills":["Arabic","Video"],
"scheduledTime":"2025-06-03T10:30:00Z",
"priority":5,
"attributes":{"productLine":"Post-paid"}
}
Genesys Cloud now has a scheduled callback that Architect will route at 14:30 GST on 3 Jun.
If the tenant flag sendCustomerEmail=true is on, VideoEngager calls its SMTP/SES service:
If notifyAgent=true, the back-end looks up the agent group tied to VIP-Video-Q and sends each member an event invite (or just the assigned advisor if workforce-mgmt pre-assignment is enabled).
With reminderOffset=15 minutes, the back-end inserts a job in its Reminder Scheduler:
runAt = scheduledTime - 15 min
action = sendReminderEmail(visitorEmail, meetURL)
SMS can be added by pointing the same job to CPaaS SMS.
| §7.2 Need | Implementation in flow above |
|---|---|
| Two-click calendar booking | Steps 2–4 with /availability + visual widget |
| Masked PII | Genesys org-level masking rules still apply to scheduled callbacks |
| Queue & skill-based routing | queueId, skills, attributes passed in callback object |
| Customer & agent notifications | Steps 6-7, configurable flags |
| Reminder | Step 8, offset-driven scheduler |
| Multimedia tools at call time | Same VideoEngager WebRTC room (screen-share, annotations, etc.) |
That’s the complete business and technical story your stakeholders will want to hear for the scheduled path. Let me know if you’d like a fresh Mermaid diagram or code snippets for the /availability handler!
sequenceDiagram autonumber %% ───────── Participants ───────── participant C as Customer Browser participant VF as VE Facade participant CP as ChatProviderImpl participant CORE as GuestMessagingSdkCore participant WS as WebSocketTransportAdapter participant GCM as Genesys Cloud Messaging participant VEA as VideoEngager API participant GCR as Genesys Architect (Routing) participant AG as Agent Desktop participant EM as Email Service (opt) %% ───────── 1. Start chat & send visitor data ───────── C->>VF: Click Start Chat (name, email, phone, attrs) VF->>CP: startSession(cfg) CP->>WS: connect() WS-->>CORE: WebSocket open CORE->>WS: configureSession + customAttributes WS->>GCM: WS frame configureSession GCM-->>WS: SessionResponse CORE->>WS: joinEvent Note over C,GCM: Messenger chat ready %% ───────── 2. Live chat ───────── loop Text Chat C->>GCM: Send message GCM->>AG: Deliver message AG->>GCM: Send response GCM->>C: Deliver response end %% ───────── 3. Escalate to video ───────── alt Video Initiation opt Agent offers video AG->>C: Quick-reply "Start Video" end C->>VF: Click Start Video VF->>VEA: POST /create (desired_time=now, conversationId, routingData) VEA->>GCR: POST /conversations/callbacks (routingData) GCR->>AG: Callback toast (queue/skills match) AG->>GCR: Accept callback GCR->>VEA: callbackId, meetURL VEA->>VF: meetURL VF->>C: Open WebRTC iframe/pop-up end Note over C,AG: HD video + chat in one interaction %% ───────── 4. Optional notification ───────── opt Email enabled VEA->>EM: Send "Your video call is starting" email end
The visitor presses Start Chat on your page.
VideoEngager.startGenesysChat({
deploymentId,
locale,
visitor: { name, email, phone }, // ← data you want Architect to see
customAttributes: { productLine: "Post-paid", lang: "ar" }
});
Where the code lives – the call lands in ChatProviderImpl.startSession(), which stores the visitor and attribute bundle in _initialAttributes for later transmission.
WebSocketTransportAdapter.connect() opens the secure socket to Genesys. GuestMessagingSdkCore sends a configureSession frame whose body already contains the customAttributes object above.SessionResponse; the provider flips to READY and the chat UI appears.
Result: a Messenger interaction now exists in Genesys Cloud with the attributes productLine=Post-paid, lang=ar, etc.When the customer (or the agent) clicks Start Video, the façade invokes:
VideoEngager.startVideoChatSession(conversationId, {
queueId: "VIP-Video-Q",
skills: ["Arabic", "Video"],
priority: 5,
attributes: { productLine: "Post-paid" }
});
Backend flow
/create with desired_time=now and the Messenger conversationId.POST /conversations/callbacks in Genesys Cloud with:{
"conversationId": "…",
"routingData": {
"queueId": "VIP-Video-Q",
"skills": ["Arabic","Video"],
"priority": 5,
"attributes": { "productLine": "Post-paid" }
},
"callbackNumbers": ["+971…"],
"callbackUserName": "Visitor name"
}
Architect looks at that routingData exactly as it would for any other media type:
productLine = Post-paid (used in Decision / Data Action blocks)Because the new Callback object is attached to the existing Messenger conversation, Architect treats it as a multimedia continuation of the same interaction; all attributes from the Messenger leg are still present.
What the agent sees
The agent who matches queue + skills and is next in line receives an immediate video-callback toast in the Genesys desktop.
Accepting the call automatically:
Because both legs share the same interactionId, the agent’s timeline, recording, and analytics all show one unified record of chat ➜ video.
| §7.2 demand | Implemented how |
|---|---|
| Data capture & transfer | customAttributes passed through the SDK → configureSession → Architect |
| Immediate video escalation | desired_time = now in /create |
| Attribute-based routing | queueId, skills, priority, attributes in routingData drive Architect |
| Full multimedia tool-set | VideoEngager WebRTC room inherits screen-share, annotation, remote-control |
| Unified analytics & compliance | Messenger + Callback combined under one interactionId |
This is precisely the path the diagram depicts: data collected → session configured with those attributes → Architect routes on them → agent receives a single, attribute-aware video interaction.